/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package simulador;

import java.util.*;

public class Generador {
    
    private int maxNumVuelos;
    private Parametros mapa;
    private ArrayList<Vuelo> vuelos = new ArrayList<Vuelo>();
    private int[] tamanhos = new int[4];
    public final static int RANGO_HORAS_FECHAS = 5;
    public final static int NUMERO_CONTINENTES = 4;
    public final static int COSTO_BASE_PAQUETE = 4;
    public final static int COSTO_INTER_PAQUETE = 6;
    public final static int NUMERO_CIUDADES_CONTINENTE = 14;
    private int iteracion;
    private final static int VALOR_BASE_CAPACIDAD = 120;
    private final static int VALOR_MAXIMO_DESVIACION = 8;
    private final static int PESO_DESVIACION = 20;
    private final static int VALOR_BASE_CAPACIDAD_DISPONIBLE = 100;
    private final static int PESO_DESVIACION_DISPONIBLE = 15;
    private final static int VALOR_BASE_COSTO = 8;
    private final static int VALOR_MAXIMO_DESVIACION_COSTO = 8;
    /**
     * FECHA INICIAL DE GENERACION DE VUELOS HISTORICOS
     */
    private Calendar fechaInicialPasada = Calendar.getInstance();
    
    public Generador(Parametros mundo, int numVuelos) {
        this.maxNumVuelos = numVuelos;
        this.mapa = mundo;
    }
    
    public void desordenaCuidades() {
        int tamanhoAsia = mapa.getAsia().size();
        int tamanhoEuropa = mapa.getEuropa().size();
        int tamanhoAsur = mapa.getSudamerica().size();
        int tamanhoAnorte = mapa.getNorteamerica().size();
        this.tamanhos[0] = tamanhoAsur;
        this.tamanhos[1] = tamanhoAnorte;
        this.tamanhos[2] = tamanhoEuropa;
        this.tamanhos[3] = tamanhoAsia;
        
        Collections.shuffle(mapa.getAsia());
        Collections.shuffle(mapa.getEuropa());
        Collections.shuffle(mapa.getNorteamerica());
        Collections.shuffle(mapa.getSudamerica());
        Collections.shuffle(mapa.getCiudades());
    }
    
    public void generarVuelosIniciales() {
        Vuelo nuevoVuelo, nuevoVuelo2, nuevoVuelo3, nuevoVuelo4, nuevoVuelo5, nuevoVuelo6, nuevoVuelo7, nuevoVuelo8;
        Vuelo nuevoVuelo11, nuevoVuelo12, nuevoVuelo9, nuevoVuelo10;
        Vuelo nuevoVuelo13, nuevoVuelo14, nuevoVuelo15, nuevoVuelo16, nuevoVuelo17, nuevoVuelo18;
        Vuelo nuevoVuelo19, nuevoVuelo20, nuevoVuelo21, nuevoVuelo22, nuevoVuelo23, nuevoVuelo24;
        String codVuelo;
        int tamanhoFinal;
        
        Random randomGenerator = new Random();
        
        this.iteracion = 0;
        
        
        
        for (int diaActual = 0; diaActual < 1; diaActual++) {
            // Recorre 3 meses
            for (int k = 0; k < NUMERO_CONTINENTES; k++) { //aqui va iterar para los 4 continentes para crear vuelos entre ellos

                for (int i = 0; i < this.tamanhos[k] - 1; i++) {
                    
                    int valorDesviacionCapacidadTotal = randomGenerator.nextInt(VALOR_MAXIMO_DESVIACION);
                    int valorDesviacionCapacidadDisponible = randomGenerator.nextInt(VALOR_MAXIMO_DESVIACION);

                    // TODO solucionar porque otorga mayor posibilidad a que salga duracion Minima
                    nuevoVuelo = new Vuelo();
                    this.iteracion++;
                    codVuelo = this.generaCodigoVuelo(this.iteracion);
                    nuevoVuelo.setCodVuelo(codVuelo);
                    this.setearFechaCosto(nuevoVuelo, k, diaActual);
                    this.setearOrigenDestino(nuevoVuelo, k, i, 1);
                    nuevoVuelo.setCapacidadCarga(VALOR_BASE_CAPACIDAD + valorDesviacionCapacidadTotal * PESO_DESVIACION);
                    nuevoVuelo.setCapacidadDisponible(VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE > nuevoVuelo.getCapacidadCarga() ? nuevoVuelo.getCapacidadCarga()
                            : VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE);
                    
                    nuevoVuelo2 = new Vuelo();
                    nuevoVuelo3 = new Vuelo();
                    nuevoVuelo4 = new Vuelo();
                    nuevoVuelo9 = new Vuelo();
                    nuevoVuelo10 = new Vuelo();
                    
                    this.generaVueloRetorno(nuevoVuelo, nuevoVuelo2, diaActual);
                    this.generaVueloPosterior(nuevoVuelo, nuevoVuelo3, 24);
                    this.generaVueloPosterior(nuevoVuelo2, nuevoVuelo4, 24);
                    
                    this.generaVueloPosterior(nuevoVuelo, nuevoVuelo9, 12);
                    this.generaVueloPosterior(nuevoVuelo2, nuevoVuelo10, i);
                    
                    this.vuelos.add(nuevoVuelo);
                    this.vuelos.add(nuevoVuelo2);
                    this.vuelos.add(nuevoVuelo3);
                    this.vuelos.add(nuevoVuelo4);
                    this.vuelos.add(nuevoVuelo9);
                    this.vuelos.add(nuevoVuelo10);
                    
                    
                    if ((this.tamanhos[k] / 2 % 2) == 0) {
                        tamanhoFinal = this.tamanhos[k] / 2;
                    } else {
                        tamanhoFinal = Math.round(this.tamanhos[k] / 2) - 1;
                    }
                    
                    if (i < tamanhoFinal) {
                        nuevoVuelo5 = new Vuelo();
                        this.iteracion++;
                        codVuelo = this.generaCodigoVuelo(this.iteracion);
                        nuevoVuelo5.setCodVuelo(codVuelo);
                        this.setearOrigenDestino(nuevoVuelo5, k, i, tamanhoFinal);
                        this.setearFechaCosto(nuevoVuelo5, k, diaActual);
                        nuevoVuelo.setCapacidadCarga(VALOR_BASE_CAPACIDAD + valorDesviacionCapacidadTotal * PESO_DESVIACION);
                        nuevoVuelo.setCapacidadDisponible(VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE > nuevoVuelo.getCapacidadCarga() ? nuevoVuelo.getCapacidadCarga()
                                : VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE);
                        
                        nuevoVuelo6 = new Vuelo();
                        nuevoVuelo7 = new Vuelo();
                        nuevoVuelo8 = new Vuelo();
                        nuevoVuelo11 = new Vuelo();
                        nuevoVuelo12 = new Vuelo();
                        
                        this.generaVueloRetorno(nuevoVuelo5, nuevoVuelo6, diaActual);
                        this.generaVueloPosterior(nuevoVuelo5, nuevoVuelo7, 24);
                        this.generaVueloPosterior(nuevoVuelo6, nuevoVuelo8, 24);
                        
                        this.generaVueloPosterior(nuevoVuelo5, nuevoVuelo11, 12);
                        this.generaVueloPosterior(nuevoVuelo6, nuevoVuelo12, 12);
                        
                        this.vuelos.add(nuevoVuelo5);
                        this.vuelos.add(nuevoVuelo6);
                        this.vuelos.add(nuevoVuelo7);
                        this.vuelos.add(nuevoVuelo8);
                        this.vuelos.add(nuevoVuelo11);
                        this.vuelos.add(nuevoVuelo12);
                    }
                    
                    if (i < tamanhoFinal + tamanhoFinal / 4) {
                        
                        nuevoVuelo19 = new Vuelo();
                        this.iteracion++;
                        codVuelo = this.generaCodigoVuelo(this.iteracion);
                        nuevoVuelo19.setCodVuelo(codVuelo);
                        this.setearOrigenDestino(nuevoVuelo19, k, i, tamanhoFinal / 4);
                        this.setearFechaCosto(nuevoVuelo19, k, diaActual);
                        nuevoVuelo.setCapacidadCarga(VALOR_BASE_CAPACIDAD + valorDesviacionCapacidadTotal * PESO_DESVIACION);
                        nuevoVuelo.setCapacidadDisponible(VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE > nuevoVuelo.getCapacidadCarga() ? nuevoVuelo.getCapacidadCarga()
                                : VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE);
                        
                        nuevoVuelo24 = new Vuelo();
                        nuevoVuelo20 = new Vuelo();
                        nuevoVuelo21 = new Vuelo();
                        nuevoVuelo22 = new Vuelo();
                        nuevoVuelo23 = new Vuelo();
                        
                        this.generaVueloRetorno(nuevoVuelo19, nuevoVuelo20, diaActual);
                        this.generaVueloPosterior(nuevoVuelo19, nuevoVuelo21, 24);
                        this.generaVueloPosterior(nuevoVuelo20, nuevoVuelo22, 24);
                        
                        this.generaVueloPosterior(nuevoVuelo19, nuevoVuelo23, 12);
                        this.generaVueloPosterior(nuevoVuelo20, nuevoVuelo24, 12);
                        
                        this.vuelos.add(nuevoVuelo19);
                        this.vuelos.add(nuevoVuelo20);
                        this.vuelos.add(nuevoVuelo21);
                        this.vuelos.add(nuevoVuelo22);
                        this.vuelos.add(nuevoVuelo23);
                        this.vuelos.add(nuevoVuelo24);
                    }
                    if (i < tamanhoFinal + tamanhoFinal / 2) {
                        nuevoVuelo13 = new Vuelo();
                        this.iteracion++;
                        codVuelo = this.generaCodigoVuelo(this.iteracion);
                        nuevoVuelo13.setCodVuelo(codVuelo);
                        this.setearOrigenDestino(nuevoVuelo13, k, i, tamanhoFinal / 2);
                        this.setearFechaCosto(nuevoVuelo13, k, diaActual);
                        nuevoVuelo.setCapacidadCarga(VALOR_BASE_CAPACIDAD + valorDesviacionCapacidadTotal * PESO_DESVIACION);
                        nuevoVuelo.setCapacidadDisponible(VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE > nuevoVuelo.getCapacidadCarga() ? nuevoVuelo.getCapacidadCarga()
                                : VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE);
                        
                        nuevoVuelo14 = new Vuelo();
                        nuevoVuelo15 = new Vuelo();
                        nuevoVuelo16 = new Vuelo();
                        nuevoVuelo17 = new Vuelo();
                        nuevoVuelo18 = new Vuelo();
                        
                        this.generaVueloRetorno(nuevoVuelo13, nuevoVuelo14, diaActual);
                        this.generaVueloPosterior(nuevoVuelo13, nuevoVuelo15, 24);
                        this.generaVueloPosterior(nuevoVuelo14, nuevoVuelo16, 24);
                        
                        this.generaVueloPosterior(nuevoVuelo13, nuevoVuelo17, 12);
                        this.generaVueloPosterior(nuevoVuelo14, nuevoVuelo18, 12);
                        
                        this.vuelos.add(nuevoVuelo13);
                        this.vuelos.add(nuevoVuelo14);
                        this.vuelos.add(nuevoVuelo15);
                        this.vuelos.add(nuevoVuelo16);
                        this.vuelos.add(nuevoVuelo17);
                        this.vuelos.add(nuevoVuelo18);
                    }
                    
                }
                
            }
        }
        
    }

    //public 
    public ArrayList<Vuelo> generarVuelos() {
        fechaInicialPasada.set(Calendar.YEAR, 2012);
        fechaInicialPasada.set(Calendar.MONTH, 5);
        fechaInicialPasada.set(Calendar.DAY_OF_MONTH, 1);
        desordenaCuidades();
        generarVuelosIniciales();
        generarVuelosInternacionales();
        
        return vuelos;
    }
    
    public void generaVueloPosterior(Vuelo vuelo, Vuelo nuevoVuelo, int tiempoExtra) {
        Date fechaPartida, fechaLlegada, fechaSalida;
        String codVuelo;
        int duracion;
        
        nuevoVuelo.setCapacidadCarga(vuelo.getCapacidadCarga());
        nuevoVuelo.setCapacidadDisponible(vuelo.getCapacidadDisponible());
        nuevoVuelo.setCodigoCiudadDestino(vuelo.getCodigoCiudadDestino());
        nuevoVuelo.setCodigoCiudadOrigen(vuelo.getCodigoCiudadOrigen());
        if (tiempoExtra == 24) {
            nuevoVuelo.setCodVuelo(vuelo.getCodVuelo());
        } else {
            this.iteracion++;
            codVuelo = this.generaCodigoVuelo(this.iteracion);
            nuevoVuelo.setCodVuelo(codVuelo);
        }
        
        nuevoVuelo.setCostoPorPaquete(vuelo.getCostoPorPaquete());
        nuevoVuelo.setDuracion(vuelo.getDuracion());
        
        duracion = (int) vuelo.getDuracion();
        
        Calendar calFechaSal = Calendar.getInstance();
        fechaPartida = vuelo.getFechaPartida();
        calFechaSal.setTime(fechaPartida);
        
        calFechaSal.add(Calendar.HOUR, tiempoExtra);
        fechaSalida = calFechaSal.getTime();
        calFechaSal.add(Calendar.HOUR, duracion);
        fechaLlegada = calFechaSal.getTime();
        
        nuevoVuelo.setFechaLlegada(fechaLlegada);
        nuevoVuelo.setFechaPartida(fechaSalida);
    }
    
    public void generaVueloRetorno(Vuelo vuelo, Vuelo nuevoVuelo, int diaActual) {
        int rangoFechas, duracionFinal;
        Random rand = new Random();
        Calendar ahora;
        Date fechaSalida, fechaLlegada;
        String codVuelo;
        String ciudadDestino, ciudadOrigen;
        double costoPaquete;
        
        ciudadDestino = vuelo.getCodigoCiudadOrigen();
        ciudadOrigen = vuelo.getCodigoCiudadDestino();
        costoPaquete = vuelo.getCostoPorPaquete();
        duracionFinal = (int) vuelo.getDuracion();
        
        int separacionHoras = rand.nextInt(RANGO_HORAS_FECHAS); //aqui le doy un rango de fechas
        // Codigo nuevo
        rangoFechas = (24 * diaActual) + separacionHoras;
        // Codigo nuevo
        // RANGOFECHAS = 24*i y AHORA = fechaInicialPasada(tipo calendar)
//        ahora = Calendar.getInstance();
        ahora = fechaInicialPasada;
        ahora.add(Calendar.DAY_OF_YEAR, diaActual);
        ahora.add(Calendar.HOUR, separacionHoras);
        fechaSalida = ahora.getTime();
        ahora.add(Calendar.HOUR, duracionFinal);
        fechaLlegada = ahora.getTime();
        
        this.iteracion++;
        codVuelo = this.generaCodigoVuelo(this.iteracion);
        Random randomGenerator = new Random();
        int valorDesviacionCapacidadTotal = randomGenerator.nextInt(VALOR_MAXIMO_DESVIACION);
        int valorDesviacionCapacidadDisponible = randomGenerator.nextInt(VALOR_MAXIMO_DESVIACION);
        
        nuevoVuelo.setCapacidadCarga(VALOR_BASE_CAPACIDAD + valorDesviacionCapacidadTotal * PESO_DESVIACION);
        nuevoVuelo.setCapacidadDisponible(VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE > nuevoVuelo.getCapacidadCarga() ? nuevoVuelo.getCapacidadCarga()
                : VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE);
        nuevoVuelo.setCodigoCiudadOrigen(ciudadOrigen);
        nuevoVuelo.setCodigoCiudadDestino(ciudadDestino);
        nuevoVuelo.setFechaLlegada(fechaLlegada);
        nuevoVuelo.setFechaPartida(fechaSalida);
        nuevoVuelo.setDuracion(duracionFinal);
        nuevoVuelo.setCostoPorPaquete(costoPaquete);
        nuevoVuelo.setCodVuelo(codVuelo);
        
        
    }
    
    public void setearOrigenDestino(Vuelo vuelo, int k, int i, int indiceDest) {
        Ciudad ciudadOrigen, ciudadDestino;
        switch (k) {
            case 0:
                ciudadOrigen = mapa.getSudamerica().get(i);
                ciudadDestino = mapa.getSudamerica().get(i + indiceDest);
                break;
            case 1:
                ciudadOrigen = mapa.getNorteamerica().get(i);
                ciudadDestino = mapa.getNorteamerica().get(i + indiceDest);
                break;
            case 2:
                ciudadOrigen = mapa.getEuropa().get(i);
                ciudadDestino = mapa.getEuropa().get(i + indiceDest);
                break;
            default:
                ciudadOrigen = mapa.getAsia().get(i);
                ciudadDestino = mapa.getAsia().get(i + indiceDest);
                break;
        }
        vuelo.setCodigoCiudadOrigen(ciudadOrigen.getCodigo());
        vuelo.setCodigoCiudadDestino(ciudadDestino.getCodigo());
    }
    
    public void setearFechaCosto(Vuelo vuelo, int k, int diaActual) {
        Random rand = new Random();
        int duracionRandom, maximoDuracion, minimoDuracion, duracionFinal, rangoFechas;
        Calendar ahora;
        Date fechaSalida, fechaLlegada;
        double costoPaquete;
        
        maximoDuracion = mapa.getDuracionesMaximas()[k][k]; //[k][k] es el max de duracion para el continente
        minimoDuracion = mapa.getDuracionesMinimas()[k][k];
        
        duracionRandom = rand.nextInt(maximoDuracion + 1);
        
        if (duracionRandom < minimoDuracion) {
            duracionFinal = minimoDuracion;
            costoPaquete = COSTO_BASE_PAQUETE;
        } else {
            duracionFinal = duracionRandom;
            costoPaquete = duracionFinal - minimoDuracion + COSTO_BASE_PAQUETE;
        }

        // CHUCHADOR
//        //RANGO_FECHAS = dia*24 y AHORA = fechaInicialPasada(Calendar)
//        rangoFechas = rand.nextInt(RANGO_HORAS_FECHAS); //aqui le doy un rango de fechas
//        ahora = Calendar.getInstance();
//        ahora.add(Calendar.HOUR, rangoFechas);
//        fechaSalida = ahora.getTime();
//        ahora.add(Calendar.HOUR, duracionFinal);
//        fechaLlegada = ahora.getTime();

        int separacionHoras = rand.nextInt(RANGO_HORAS_FECHAS); //aqui le doy un rango de fechas
        // Codigo nuevo
        rangoFechas = (24 * diaActual) + separacionHoras;
        // Codigo nuevo
        // RANGOFECHAS = 24*i y AHORA = fechaInicialPasada(tipo calendar)
//        ahora = Calendar.getInstance();
        ahora = fechaInicialPasada;
        ahora.add(Calendar.DAY_OF_YEAR, diaActual);
        ahora.add(Calendar.HOUR, separacionHoras);
        fechaSalida = ahora.getTime();
        ahora.add(Calendar.HOUR, duracionFinal);
        fechaLlegada = ahora.getTime();
        
        
        
        vuelo.setFechaLlegada(fechaLlegada);
        vuelo.setFechaPartida(fechaSalida);
        vuelo.setCostoPorPaquete(costoPaquete);
        vuelo.setDuracion(duracionFinal);
        
    }
    
    public void generarVuelosInternacionales() {
        Vuelo nuevoVuelo, nuevoVuelo2, nuevoVuelo3, nuevoVuelo4;
        String contPartida, contLlegada;
        String codVuelo;
        double costoPaquete;
        Date fechaLlegada, fechaSalida;
        int duracionRandom, maximoDuracion, minimoDuracion, duracionFinal, rangoFechas;
        Random rand = new Random();
        Calendar ahora;
        String codCiudadOrigen, codCiudadDestino;
        
        int j = 0;
        
        for (int diaActual = 0; diaActual < 90; diaActual++) {
            // recorre 3 meses
            for (int i = 0; i < NUMERO_CIUDADES_CONTINENTE; i++) {

                //americaS- americaN
                //americaS- europa
                //americaS- Asia

                contPartida = mapa.getSudamerica().get(0).getContinente();
                contLlegada = mapa.getNorteamerica().get(0).getContinente();
                codCiudadOrigen = mapa.getSudamerica().get(i).getCodigo();
                codCiudadDestino = mapa.getNorteamerica().get(i).getCodigo();
                this.generarVueloInter(i, contPartida, contLlegada, codCiudadOrigen, codCiudadDestino, diaActual);
                
                contPartida = mapa.getSudamerica().get(0).getContinente();
                contLlegada = mapa.getEuropa().get(0).getContinente();
                codCiudadOrigen = mapa.getSudamerica().get(i).getCodigo();
                codCiudadDestino = mapa.getEuropa().get(i).getCodigo();
                this.generarVueloInter(i, contPartida, contLlegada, codCiudadOrigen, codCiudadDestino, diaActual);
                
                contPartida = mapa.getSudamerica().get(0).getContinente();
                contLlegada = mapa.getAsia().get(0).getContinente();
                codCiudadOrigen = mapa.getSudamerica().get(i).getCodigo();
                codCiudadDestino = mapa.getAsia().get(i).getCodigo();
                this.generarVueloInter(i, contPartida, contLlegada, codCiudadOrigen, codCiudadDestino, diaActual);

                //AmericaN- Europa

                contPartida = mapa.getNorteamerica().get(0).getContinente();
                contLlegada = mapa.getEuropa().get(0).getContinente();
                codCiudadOrigen = mapa.getNorteamerica().get(i).getCodigo();
                codCiudadDestino = mapa.getEuropa().get(i).getCodigo();
                this.generarVueloInter(i, contPartida, contLlegada, codCiudadOrigen, codCiudadDestino, diaActual);

                //AmericaN- Asia
                contPartida = mapa.getNorteamerica().get(0).getContinente();
                contLlegada = mapa.getAsia().get(0).getContinente();
                codCiudadOrigen = mapa.getNorteamerica().get(i).getCodigo();
                codCiudadDestino = mapa.getAsia().get(i).getCodigo();
                this.generarVueloInter(i, contPartida, contLlegada, codCiudadOrigen, codCiudadDestino, diaActual);

                //Asia-Europa
                contPartida = mapa.getAsia().get(0).getContinente();
                contLlegada = mapa.getEuropa().get(0).getContinente();
                codCiudadOrigen = mapa.getAsia().get(i).getCodigo();
                codCiudadDestino = mapa.getEuropa().get(i).getCodigo();
                this.generarVueloInter(i, contPartida, contLlegada, codCiudadOrigen, codCiudadDestino, diaActual);
                
            }
        }
    }
    
    public void generarVueloInter(int indice, String contPartida, String contLlegada, String codCiudadOrigen, String codCiudadDestino, int diaActual) {
        
        String codVuelo;
        Vuelo nuevoVuelo, nuevoVuelo2, nuevoVuelo3, nuevoVuelo4;
        
        this.iteracion++;
        codVuelo = this.generaCodigoVuelo(this.iteracion);
        
        nuevoVuelo = new Vuelo();
        
        Random randomGenerator = new Random();
        
        int valorDesviacionCapacidadTotal = randomGenerator.nextInt(VALOR_MAXIMO_DESVIACION);
        int valorDesviacionCapacidadDisponible = randomGenerator.nextInt(VALOR_MAXIMO_DESVIACION);
        
        this.setearFechasCostosInternac(contPartida, contLlegada, nuevoVuelo, diaActual);
        nuevoVuelo.setCodVuelo(codVuelo);
        nuevoVuelo.setCodigoCiudadOrigen(codCiudadOrigen);
        nuevoVuelo.setCodigoCiudadDestino(codCiudadDestino);
        nuevoVuelo.setCapacidadCarga(VALOR_BASE_CAPACIDAD + valorDesviacionCapacidadTotal * PESO_DESVIACION);
        nuevoVuelo.setCapacidadDisponible(VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE > nuevoVuelo.getCapacidadCarga() ? nuevoVuelo.getCapacidadCarga()
                : VALOR_BASE_CAPACIDAD_DISPONIBLE + valorDesviacionCapacidadDisponible * PESO_DESVIACION_DISPONIBLE);
        
        
        nuevoVuelo2 = new Vuelo();
        nuevoVuelo3 = new Vuelo();
        nuevoVuelo4 = new Vuelo();
        
        this.generaVueloRetorno(nuevoVuelo, nuevoVuelo2, diaActual);
        this.generaVueloPosterior(nuevoVuelo, nuevoVuelo3, 24);
        this.generaVueloPosterior(nuevoVuelo2, nuevoVuelo4, 24);
        
        this.vuelos.add(nuevoVuelo);
        this.vuelos.add(nuevoVuelo2);
        this.vuelos.add(nuevoVuelo3);
        this.vuelos.add(nuevoVuelo4);
    }
    
    public void setearFechasCostosInternac(String contPartida, String contLlegada, Vuelo vuelo, int diaActual) {
        Date fechaLlegada, fechaSalida;
        double costoPaquete;
        int duracionRandom, maximoDuracion, minimoDuracion, duracionFinal, rangoFechas;
        Random rand = new Random();
        Calendar ahora;
        maximoDuracion = this.buscarTiempoEntreContinentes(contPartida, contLlegada, 1);
        minimoDuracion = this.buscarTiempoEntreContinentes(contPartida, contLlegada, 0);
        duracionRandom = rand.nextInt(maximoDuracion + 1);
        
        if (duracionRandom < minimoDuracion) {
            duracionFinal = minimoDuracion;
            costoPaquete = COSTO_INTER_PAQUETE;
            
        } else {
            duracionFinal = duracionRandom;
            costoPaquete = duracionFinal - minimoDuracion + COSTO_INTER_PAQUETE;
        }


//        rangoFechas = rand.nextInt(RANGO_HORAS_FECHAS); //aqui le doy un rango de fechas
//        ahora = Calendar.getInstance();
//        ahora.add(Calendar.HOUR, rangoFechas);
//        fechaSalida = ahora.getTime();
//        ahora.add(Calendar.HOUR, duracionFinal);
//        fechaLlegada = ahora.getTime();

        int separacionHoras = rand.nextInt(RANGO_HORAS_FECHAS); //aqui le doy un rango de fechas
        // Codigo nuevo
        rangoFechas = (24 * diaActual) + separacionHoras;
        // Codigo nuevo
        // RANGOFECHAS = 24*i y AHORA = fechaInicialPasada(tipo calendar)
//        ahora = Calendar.getInstance();
        ahora = fechaInicialPasada;
        ahora.add(Calendar.DAY_OF_YEAR, diaActual);
        ahora.add(Calendar.HOUR, separacionHoras);
        fechaSalida = ahora.getTime();
        ahora.add(Calendar.HOUR, duracionFinal);
        fechaLlegada = ahora.getTime();
        
        vuelo.setFechaLlegada(fechaLlegada);
        vuelo.setFechaPartida(fechaSalida);
        vuelo.setCostoPorPaquete(costoPaquete);
        vuelo.setDuracion(duracionFinal);
    }
    
    public int buscarTiempoEntreContinentes(String contP, String contL, int i) {
        if (contP.equals("SUD")) {
            if (contL.equals("SUD")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[0][0];
                } else {
                    return mapa.getDuracionesMinimas()[0][0];
                }
            } else if (contL.equals("NOR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[0][1];
                } else {
                    return mapa.getDuracionesMinimas()[0][1];
                }
            } else if (contL.equals("EUR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[0][2];
                } else {
                    return mapa.getDuracionesMinimas()[0][2];
                }
            } else {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[0][3];
                } else {
                    return mapa.getDuracionesMinimas()[0][3];
                }
            }
        } else if (contP.equals("NOR")) {
            if (contL.equals("SUD")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[1][0];
                } else {
                    return mapa.getDuracionesMinimas()[1][0];
                }
            } else if (contL.equals("NOR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[1][1];
                } else {
                    return mapa.getDuracionesMinimas()[1][1];
                }
            } else if (contL.equals("EUR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[1][2];
                } else {
                    return mapa.getDuracionesMinimas()[1][2];
                }
            } else {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[1][3];
                } else {
                    return mapa.getDuracionesMinimas()[1][3];
                }
            }
        } else if (contP == "EUR") {
            if (contL.equals("SUD")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[2][0];
                } else {
                    return mapa.getDuracionesMinimas()[2][0];
                }
            } else if (contL.equals("NOR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[2][1];
                } else {
                    return mapa.getDuracionesMinimas()[2][1];
                }
            } else if (contL.equals("EUR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[2][2];
                } else {
                    return mapa.getDuracionesMinimas()[2][2];
                }
            } else {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[2][3];
                } else {
                    return mapa.getDuracionesMinimas()[2][3];
                }
            }
        } else {
            if (contL.equals("SUD")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[3][0];
                } else {
                    return mapa.getDuracionesMinimas()[3][0];
                }
            } else if (contL.equals("NOR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[3][1];
                } else {
                    return mapa.getDuracionesMinimas()[3][1];
                }
            } else if (contL.equals("EUR")) {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[3][2];
                } else {
                    return mapa.getDuracionesMinimas()[3][2];
                }
            } else {
                if (i == 1) {
                    return mapa.getDuracionesMaximas()[3][3];
                } else {
                    return mapa.getDuracionesMinimas()[3][3];
                }
            }
        }
    }
    
    public String generaCodigoVuelo(int iteracion) {
        String id = Integer.toString(iteracion);
        int numdig = id.length();
        for (int i = 1; i <= 5 - numdig; i++) {
            id = "0" + id;
        }
        id = "VUE" + id;
        return id;
    }
}
